package antrace;

/**
 * Hej David!
 * Jag löste det första problemet, att det blev tomt och sen kom ett block efter ett tag.
 * Dock har det dykt upp lite fler problem.
 * Bl. a så följer inte bonuslagret med jordlagret. Sen så beter sig inte lagren som de ska när
 * som flyttats, ex man kan inte gräva i jorden och tar man en bonus får man out of bounds. Knäppt!
 */

import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.TiledLayer;

public abstract class AbstractGameLayer extends TiledLayer {

	/** Bredden i kolumner (ej pixlar) på den del av TiledLayer som är fylld. */
	//protected int filledWidth;

	protected AbstractGameLayer(int columns, int rows, Image image, int tileWidth,
			int tileHeight) {
		super(columns, rows, image, tileWidth, tileHeight);
	}

	/**
	 * Ta tiles från byte[] cells och lägg in i TiledLayer-objektet.
	 * @param cells array som beskriver lagrets innehåll (är eg en "matris")
	 * @param width bredden på banan (som man inte vet annars, eftersom cells 
	 * 		är en endimensionell matris
	 */
	public void createTiledLayerFromArray(byte[] cells, int width) {

		for (int i = 0; i < cells.length; i++) {
			int col = i % width;
			int row = i / width;
			this.setCell(col, row, cells[i]);
		}	
	}
	
	public void createTiledLayerFromArray(byte[] cells, int width, int startColumn) {

		for (int i = 0; i < cells.length; i++) {
			int col = (i % width) + startColumn;
			int row = i / width;
			this.setCell(col, row, cells[i]);
		}	
	}

	public void moveLayerBlocks(byte[] tileArray, int blockWidth) {
		
		for(int block=0; block < 3; block++){
			for(int row=0; row < 12; row++){
				for(int col=0; col < blockWidth; col++){		
					//kopiera celler från block2 till block1 och block3 till block 2
					if(block != 2){
						this.setCell(col+block*blockWidth, row, this.getCell(col+(block+1)*blockWidth, row));
					}					
					//sätt nya celler från tileArray
					else if(block == 2) {
						this.setCell(col+(block)*blockWidth, row, tileArray[(row+1)*col]);
					}
				}
			}
		}
		//flytta lagret 36 tiles åt höger
		this.move(blockWidth*20, 0);
	}

	protected int getCurrentCol(AntSprite sprite){
		/*if(sprite.getWorldX() > 36*2*this.getCellWidth())
			return sprite.getWorldX() / this.getCellWidth();
		else*/
			return sprite.getRefPixelX() / this.getCellWidth();
	}

	protected int getCurrentRow(AntSprite sprite){
		return ( sprite.getRefPixelY() - this.getY()) / this.getCellHeight();
	}

	public void reset() {
		this.setPosition(0, 0);
	}

	public void scroll(int dx) {
		dx *= -1;
		int x = this.getX() + dx;

		// När lagret tar slut, börja om från början... (oändligt repterande bakgrund)
		//x = x % this.getWidth();

		this.setPosition(x, this.getY());
	}

	public abstract void collide(AntSprite sprite);

	public abstract void update();
}
